﻿using System;
using System.Collections.Generic;
using System.Xml;
using Ro.AssistFunction.OutputManage;
using Ro.Common.RoArgs;
using Ro.Common.RoInterface;

namespace Ro.Interpreter.Cores
{
    /// <summary>
    /// 解释器前置功能
    /// 调用本方法，用以调用核心功能
    /// <para>无论是Pro版本还是Com版本，均通过本类进行tcs脚本的运行</para>
    /// </summary>
    public class PreposeFuncs : IPreposeFunc
    {
        /// <summary>
        /// 解释器主事件
        /// 解释器核心方法
        /// </summary>
        /// <param name="sigtcsfilepath">单个tcs文件路径</param>
        /// <returns>返回当前tcs文件的执行结果</returns>
        public bool CoresFunc(string sigtcsfilepath)
        {
            bool sigtcsresult;
            //根节点
            XmlNode rootNode = BackRootNode(sigtcsfilepath);

            //结果临时list
            List<bool> tempBools = new List<bool>();
            //假定根节点为空，说明tcs文件解析获取root失败
            if (rootNode != null)
            {
                //获取所有根节点下元素
                XmlNodeList allChildNodeList = rootNode.ChildNodes;

                //通过循环获取子层元素节点进行处理
                foreach (XmlNode singleChildNode in allChildNodeList)
                {
                    //针对队列中的XmlNode节点进行处理
                    bool re = GetNoodeToFuc(singleChildNode);
                    tempBools.Add(re);
                }

                //结果整体Tcs运行结果
                sigtcsresult = !(tempBools.Contains(false));
            }
            else
            {
                //结果整体Tcs运行结果
                sigtcsresult = false;
                //添加输出
                if (RoPubArgments.ProTips)
                {
                    RoOutputToGui roOutputToGui = new RoOutputToGui();
                    //获取当前时间
                    string nowtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    roOutputToGui.OutDetail(nowtime, "程序TcsFileMainEvent中，rootNode值为null");
                }
                else
                {
                    RoPubArgments.RoOutputToConsole.OutputConsole(RoLogStatus.Fatal, "程序TcsFileMainEvent中，rootNode值为null");
                }
              
                RoPubArgments.RoLog.Fatal("程序TcsFileMainEvent中，rootNode值为null");
            }
            //返回结果
            return sigtcsresult;
        }


        /// <summary>
        /// 实现获取RootNode的方法
        /// </summary>
        /// <param name="tcsfilepath">tcs文件路径</param>
        private XmlNode BackRootNode(string tcsfilepath)
        {
            XmlNode rootNode;
            try
            {
                //定义tcs文件根元素
                string tcsroot = "//tcs:TestDefinition";

                //创建 xmldoc
                XmlDocument texDoc = new XmlDocument();

                //忽略注释
                XmlReaderSettings settings = new XmlReaderSettings {IgnoreComments = true};
                XmlReader reader = XmlReader.Create(tcsfilepath, settings); //创建读取类
                texDoc.Load(reader);

                //添加前缀
                XmlNamespaceManager xmlsManager = new XmlNamespaceManager(texDoc.NameTable);
                //todo 2017-05-02 已更新至最新XSD,更新web文件
                xmlsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
                xmlsManager.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
                xmlsManager.AddNamespace("tcs", "http://tempuri.org/RoFramework.xsd");

                //xmlsManager.AddNamespace("gui", "http://tempuri.org/RoGuiAutomation.xsd");
                //xmlsManager.AddNamespace("assert", "http://tempuri.org/RoAssert.xsd");
                //xmlsManager.AddNamespace("oswin", "http://tempuri.org/RoOsWindow.xsd");

                xmlsManager.AddNamespace("web", "http://tempuri.org/RoWebAutomation.xsd");
                //根节点
                rootNode = texDoc.SelectSingleNode(tcsroot, xmlsManager);
            }
            catch (Exception e)
            {
                //添加输出
                ExceptionOutPut.SystemExceptionOut("BackRootNode", e);
                rootNode = null;
            }

            return rootNode;
        }


        /// <summary>
        /// 解释器基础核心功能
        /// 实际是对每个一级子节点进行分类处理
        /// </summary>
        /// <param name="singleChildNode">传入一级单个节点</param>
        /// <returns>反馈执行结果</returns>
        private bool GetNoodeToFuc(XmlNode singleChildNode)
        {
            //初始化
            IInterFuncCores roInterFuncCores = new InterFuncCores();
            bool re = false;
            try
            {
                switch (singleChildNode.Name)
                {
                    //脚本描述
                    case "tcs:Annotation":
                        re = roInterFuncCores.AnnotationNodes(singleChildNode);
                        break;

                    //测试设置
                    case "tcs:TestConfig":
                        re = roInterFuncCores.TestConfigNodes(singleChildNode);
                        break;

                    //启动程序选项
                    case "tcs:StartApp":
                        re = roInterFuncCores.StartAppNodes(singleChildNode);
                        break;

                    //测试主体
                    case "tcs:Tests":
                        re = roInterFuncCores.TestsNodes(singleChildNode);
                        break;

                    //关闭程序选项
                    case "tcs:CloseApp":
                        re = roInterFuncCores.CloseAppNodes(singleChildNode);
                        break;

                    //log处理
                    case "tcs:LogFunction":
                        re = roInterFuncCores.LogFunctionNodes(singleChildNode);
                        break;
                }
                //返回值
                return re;
            }
            catch (Exception e)
            {
                //添加输出
                ExceptionOutPut.SystemExceptionOut("GetNoodeToFuc", e);
                return false;
            }
        }
    }
}
